iT邦幫忙

2026 iThome 鐵人賽

DAY 28
0
IT Operation

迎接 AI 開發爆發期:告別手動部署,帶領企業團隊從 Git 規範到 CI/CD 實戰系列 第 28

Day 28 解決 Windows 權限之痛:利用工作排程器 (Task Scheduler) 驅動遠端部署

  • 分享至 

  • xImage
  •  

在之前的章節中,我們已經成功將產出物派送到 Windows 伺服器,也寫好了部署用的 PowerShell。但在最後一步「執行」時,許多工程師會遇到瓶頸:為什麼透過 SSH 遠端執行的腳本無法啟動 IIS 或操作特定權限目錄?這就是著名的 SSH 權限委派 (Double-Hop) 與 Session 隔離問題

核心痛點:為什麼直接執行會失敗?

當你透過 SSH 連入 Windows 時,系統為你分配的是一個非互動式的(Non-interactive)Session。這類 Session 存在諸多限制:

  1. 憑證無法二度轉發:你無法在 SSH Session 中再去存取遠端檔案共用或執行某些需要完整管理者權限的操作。
  2. Session 0 隔離:部分 GUI 相關或特定系統服務的操作在 SSH 下會受到攔截。

解決方案:工作排程器作為「權限代理人」

我們的策略是:在目標主機預先建立一個名為 DeploySiteWindows 工作排程 (Task Scheduler)

  • 該任務被設定為「不論使用者是否登入均執行」。
  • 該任務以具備本地管理者權限的 SYSTEMService Account 執行。
  • 關鍵動作:Jenkins 透過 SSH 僅發送一個指令:「請啟動 DeploySite 這個任務」。

實作:建立執行窗口

1. 建立 DeploySite 任務

您可以在伺服器上手動建立,或透過 PowerShell 一次性建立:

$action = New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument '-File D:\Scripts\DeploySite.ps1'
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType S4U -RunLevel Highest
Register-ScheduledTask -TaskName "DeploySite" -Action $action -Principal $principal

2. Jenkins 遠端觸發與狀態輪詢

在 Jenkins Pipeline 中,我們不只是觸發,還需要監控任務是否執行成功。

script {
    // 1. 觸發任務 (schtasks /run)
    sh "sshpass -p '${SSH_PASS}' ssh administrator@<IP> 'schtasks /run /tn DeploySite'"
    
    // 2. 輪詢狀態 (schtasks /query)
    def status = ""
    timeout(time: 10, unit: 'MINUTES') {
        while (true) {
            // 取得最後一次執行結果 (Last Result),0 代表成功
            status = sh(script: "sshpass -p '${SSH_PASS}' ssh administrator@<IP> \"schtasks /query /tn DeploySite /fo csv\" | select-string 'DeploySite' ", returnStdout: true).trim()
            
            if (status.contains(',"0"')) {
                echo "Deployment Successful!"
                break
            } else if (status.contains(',"Ready"')) {
                // 如果任務回到 Ready 狀態但 Last Result 非 0,代表失敗
                error "Deployment failed according to Task Scheduler status."
            }
            sleep 10
        }
    }
}

技術優勢

  1. 權限隔離:Jenkins SSH 帳號不需要擁有最高權限,它只需要擁有「觸發該工作排程」的權限即可。
  2. 環境一致性:腳本始終在預先定義好的環境(SYSTEM 權限)下執行,排除了 SSH 連入時可能產生的環境變數差異。
  3. 異步與穩定:即使 SSH 連線在執行中斷開,工作排程器仍會在伺服器端穩定完成任務。

總結

透過「工作排程器作為網關」的架構,我們優雅地解決了 Windows 權限限制與 Session 隔離問題。這是 Windows CI/CD 自動化實踐中最關鍵的一環。

至此,部署動作已完整。明天,我們將討論如何在部署完成後,透過監控系統(Prometheus & Grafana)獲取即時的系統健康回饋。


上一篇
Day 27 Windows 部署腳本 DeploySite.ps1:從壓縮檔到運作站台的自動化轉化
下一篇
Day 29 監控體系建置:Prometheus 與 Grafana 實務
系列文
迎接 AI 開發爆發期:告別手動部署,帶領企業團隊從 Git 規範到 CI/CD 實戰30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言